package org.afs.gescol.core.dao.interfaces;

import java.util.List;

import org.afs.gescol.core.dto.DataCriteria;
import org.afs.gescol.core.model.data.SubjectAssignment;
import org.afs.gescol.core.model.references.Subject;

/**
 * Interface for managing subject assignment.
 * @autor Kobla GBENYO (kobla.gbenyo@gmail.com)
 */
public interface SubjectManagmentDao {

    /**
     * Get Subject model by its id.
     * @param id the id of the Subject to get
     * @return the Subject to get
     */
    Subject getSubjectById(Long id);

    /**
     * Get a list of Subject models by their label.
     * @param label the label of the Subject to get
     * @return the list of Subject models those label matches with the providing label
     */
    List<Subject> getSubjectsByLabel(String label);

    /**
     * Add a new Subject Assignment.
     * @param subjectAssignment the SubjectAssignment to add
     */
    void createSubjectAssignment(SubjectAssignment subjectAssignment);

    /**
     * Get SubjectAssignment by ID.
     * @param id the SubjectAssignment to get ID
     * @return the getted SubjectAssignment
     */
    SubjectAssignment getSubjectAssignmentById(Long id);

    /**
     * Get SubjectAssignment by label.
     * @param label the SubjectAssignment to get LABEL
     * @return the getted SubjectAssignment list
     */
    List<SubjectAssignment> getSubjectAssignmentByLabel(String label);

    /**
     * Get SubjectAssignment by criteria.
     * @param criteria the criteria
     * @return the getted SubjectAssignment list
     */
    List<SubjectAssignment> getSubjectAssignmentByCriteria(DataCriteria criteria);

    /**
     * Delete a SubjectAssignment.
     * @param subjectAssignment SubjectAssignment to delete
     */
    void deleteSubjectAssignment(SubjectAssignment subjectAssignment);
}
